/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef GLOBALMANAGER_H
#define GLOBALMANAGER_H

#include "GeneralDefine.h"
#include "sysinfoget.h"
#include "md5check.h"
#include "XmlParse.h"
#include <QVector>
#include <QDateTime>
#include <QDataStream>
#include <QFile>
#include <QSettings>
#include "memoryinformation.h"
#include <gSoapFoundation/soapStub.h>
#include <gSoapFoundation/soapStub.h>
#include <gSoapFoundation/soapStub.h>
#include <gSoapFoundation/soapStub.h>
#include <gSoapFoundation/soapStub.h>
#include <gSoapFoundation/soapStub.h>

#define HARD_DISK_FREE_WARN 1000
#define HARD_DISK_FREE_ERROR 100
#define RAM_FREE_WARN 100
#define RAM_FREE_ERROR 50

#define OPERATE_OK  0
#define OPERATE_ERROR -1

//enum IoValueType{
//    E_IoValueType_NULL, //0 留空，不映射
//    E_IoValueType_DI,   // 1-DI
//    E_IoValueType_DO,   // 2-DO
//    E_IoValueType_AI,   // 3-AI
//    E_IoValueType_AO,   // 4-AO
//    E_IoValueType_SI,   // 5-SI
//    E_IoValueType_SO,   // 6-SO
//};

class RobotManager;
class PowerManager;
class BatteryMonitor;
class GlobalRegister;
/**
 * @brief The GlobalManager class 全局管理类
 */
class GlobalManager: public XmlParse
{

public:
    GlobalManager(int robId,RobotManager * robotManagerIn);

    ~GlobalManager();

public:
    int getBatteryPeakConfig(BatteryPeakConfig &configOut);
    int setBatteryPeakConfig(BatteryPeakConfig configIn);
    int setEthernetIpAddress(string netNameIn,string ipIn);
    int getRobotImageStr(string filePathIn, std::string &imageStringOut);
    int changeComputerDate(std::string dayIn,std::string timeIn);
    int changeComputerTime(std::string timeIn);
    int setDebugFlag(int debugFlagIn);
    /**
     * @brief upgradeWebHmi 检查升级包，如果有就升级
     * @return
     */
    int upgradeWebHmi();

    int getSerialPortListInfo(QStringList &ListOut);
    /**
     * @brief getRobotLogFileInfo           获取控制器端robotLog.xml日志内容
     * @param robotIdIn                     机器人编号
     * @param messagesLogOut                保存日志文件内容
     * @return                              0:Success  -1:failed
     */
    int getRobotLogFileInfo(const int &robotIdIn, std::vector< struct Message > &messagesLogOut);

    /**
     * @brief changeFileDirectorAuthority 修改data文件夹权限
     * @return
     */
    int changeFileDirectorAuthority();

    /**
     * @brief removeRobotProgramFile            删除程序文件
     * @param robotIdIn                         机器人编号
     * @param fileName                          要删除的文件名
     * @return
     */
    int removeRobotProgramFile(int robotIdIn, std::string fileName, int &returnFlag);
    int removeMapFile( std::string fileName, int &returnFlag);

    /**
     * @brief readRobotProgramFile          gsoap读取程序文件
     * @param robotIdIn                     机器号
     * @param fileName                      文件名
     * @param fileStringOut                 文件字符输出
     * @return                              success:0   failed:-1
     */
    int readRobotProgramFile(int robotIdIn,std::string fileName, std::vector <std::string> &fileStringListOut);

    /**
     * @brief writeRobotProgramFile         gsoap写入程序文件
     * @param robotIdIn                     机器号
     * @param fileName                      文件名
     * @param fileStringIn                  写入文件的字符串
     * @param returnFlag                    返回标识    success:0   failed:-1
     * @return                              success:0   failed:-1
     */
    int writeRobotProgramFile(int robotIdIn,std::string fileName, std::vector <std::string> fileStringIn,int &returnFlag);

    /**
     * @brief set_di_name_info              设置DI注释名
     * @param robotIdIn                     机器人编号
     * @param indexIn                       DI逻辑值索引
     * @param nameIn                        目标注释名
     * @param returnFlag                    执行返回结果
     * @return                              success:0   failed:-1
     */
    int set_di_name_info(int robotIdIn,int indexIn,std::string nameIn,int &returnFlag);

    /**
     * @brief set_do_name_info              设置DO注释名
     * @param robotIdIn                     机器人编号
     * @param indexIn                       DI逻辑值索引
     * @param nameIn                        目标注释名
     * @param returnFlag                    执行返回结果
     * @return                              success:0   failed:-1
     */
    int set_do_name_info(int robotIdIn,int indexIn,std::string nameIn,int &returnFlag);
    int set_ai_name_info(int robotIdIn,int indexIn,std::string nameIn,int &returnFlag);
    int set_ao_name_info(int robotIdIn,int indexIn,std::string nameIn,int &returnFlag);
    int set_si_name_info(int robotIdIn,int indexIn,std::string nameIn,int &returnFlag);
    int set_so_name_info(int robotIdIn,int indexIn,std::string nameIn,int &returnFlag);

    /************************ Get Control IO ******************/
    /**
     * @brief get_di_name_info              获取DI注释名
     * @param robotIdIn                     机器人编号
     * @param namesOut                      DI注释名输出
     * @return                              success:0   failed:-1
     */
    int get_di_name_info(int robotIdIn, std::vector<std::string> &namesOut);//文件名是固定的
    /**
     * @brief get_do_name_info              获取DO注释名
     * @param robotIdIn                     机器人编号
     * @param namesOut                      DO注释名输出
     * @return                              success:0   failed:-1
     */
    int get_do_name_info(int robotIdIn, std::vector<std::string> &namesOut);//文件名是固定的
    int get_ai_name_info(int robotIdIn, std::vector<std::string> &namesOut);//文件名是固定的
    int get_ao_name_info(int robotIdIn, std::vector<std::string> &namesOut);//文件名是固定的
    int get_si_name_info(int robotIdIn, std::vector<std::string> &namesOut);//文件名是固定的
    int get_so_name_info(int robotIdIn, std::vector<std::string> &namesOut);//文件名是固定的
    int get_All_IO_NamesInfo(int robotId, struct IOMapNamesInfo &nameOut);//文件名是固定的

    int getRobotProgramFileList(int robotIdIn,std::vector<std::string> &programFileListOut);

    int getBatteryInfo(BatteryInformation &batteryInfoOut);
    int restartNfsService();
    int getFileList(int pathType,QVector<QString>& fileList);
    int backupFile(int backUpType,int diskType, QString fileName,int robotId);
    int restoreFile(int backUpType,int diskType, QString fileName, int robotId);
    int clearAllRobotsAllRegister(int &returnFlag);
    int readVersion(std::vector <ComponentVersion> &componentVersionList);
    int getHardDiskInfo(double & totalVolume, double & freeVolume);
    int getRamInfo(double & totalVolume, double & freeVolume);
    int getCpuInfo(double & usedRatio);
    int updateHardDiskInfo();
    int updateRamInfo();
    int updateCpuInfo();
    int readStartType();
    int getStartType();
    int writeStartTypeToFile();
    int setStartType(int type);
    int forceQuitProgram();
    int controllerShutDown(bool isReboot=false);
    int controlShutDownEnable(bool enable);
    /**
     * @brief initGlobalRegValue            初始化全局寄存器数据
     */
    void initGlobalRegValue(int startType);

    void osShutDown(bool isReboot=false);

    /**
     * @brief getSystemOnTime
     * @return
     */
    int getSystemOnTime(){
        return systemOnTime;
    }
    /**
     * @brief readRegRValue   读R寄存器的值，暴露operationCall操作
     * @return
     */
    void readRegRValue_fromFile();

    /**
     * @brief saveRegRValue     保存R寄存器的值，暴露operationCall操作
     * @param tmpRValue         寄存器R数据
     */
    void saveRegRValue(QVector<double> tmpRValue);

    /**
     * @brief writeRegR2File    将Ｒ寄存器的数据写到文件
     */
//    void writeRegR2File();//not used

    /**
     * @brief writeAllRegFile   将寄存器的数据写到文件
     */
    void writeAllRegFile();
    /**
     * @brief clearRegRValue    清除Ｒ寄存器
     */
    void clearRegRValue();
    /**
     * @brief saveRegRValue     保存Ｒ寄存器的值
     * @param regNumber         寄存器ｒ的号码
     * @param regValue          寄存器的值
     */
    int saveRegRValue(int regNumber,float regValue);

    /**
     * @brief powerOff      关机
     * @return
     */
    int powerOff();
    /**
     * @brief servoOn
     * @return
     */
//    int servoOn();
//    /**
//     * @brief servoOff
//     * @return
//     */
//    int servoOff();
//    /**
//     * @brief allVersion        获取系统的组件的版本信息
//     * @param versionList
//     * @return
//     */
//    int allVersion(QVector<ComponentVersion> &versionList);
    /**
     * @brief getSystemInfo         获取系统信息
     * @return
     */
    int getSystemInfo();

    int getAllTime();

    /**
     * @brief saveSystemData         保存系统的数据
     */
    void saveSystemData();
    /**
     * @brief updateDataLevel3
     * @param updateDataLv3
     * @return
     */
    int updateDataLevel3(UpdateDataLv3 &updateDataLv3);  

    int getImageStringFromPath(QString filePath,QString &imageStringOut);

private:


    QString pixmapTostring( const QPixmap& pixmap );

    QPixmap  stringTopixmap( const QString& pic );

    /**
     * @brief readOldData           读取上一次保存的就数据
     */
    void readOldData();
//    /**
//     * @brief saveSystemData         保存系统的数据
//     */
//    void saveSystemData();
    /**
     * @brief transTimeToString     将时间为Ｓ单位的转换为年月日时分秒的字符串
     */
    void transTimeToString();
    /**
     * @brief readFirstTimeFlag     读取系统是不是第一次开机
     * @param firstFlag             第一次标志，为０则表示第一次，否则不是第一次
     */
    int readConfigFile();
    /**
     * @brief writeFirstTimeFlag    写入标志
     */
    void writeFirstTimeFlag();

    /**
     * @brief readRegRFile  读取Ｒ寄存器的值
     * @param fileName      文件名称
     */
//    void readRegRFile(QString fileName);
//    /**
//     * @brief readRegPrFile 读取ｐｒ寄存器的值
//     * @param fileName      文件名称
//     */
//    void readRegPrFile(QString fileName);
//    /**
//     * @brief readRegPlFile  读取ｐｌ寄存器的值
//     * @param fileName       文件名称
//     */
//    void readRegPlFile(QString fileName);
    /**
     * @brief Init      初始化数据
     */
    void Init();
    void realTimeSleep(long long microsecond);
    void* threadRun(void *);
    static void* threadTask( void* classPtr );
    void createThread();
    void checkResources();
    int readHardDiskInfo(double & totalVolume, double & freeVolume);
    int readRamInfo(double & totalVolume, double & freeVolume);
    int readCpuInfo(double & usedRatio);
    void addMsg(int messageLevel, std::string componentName, std::string messageType, int messageCode, int robotIdIn, int parameter1=0);

    int batteryMonitorLoop();

    int checkLicense();
    int initial_forDateFileFialed(QString xmlLogFileNameIn);
    int isDateHistoryCorrect();
    int errorSoundMonitor();
    int saveDateToXmlFile(QString xmlLogFileName);
    int readDateFromXmlFile(QString xmlLogFileName);
<<<<<<< HEAD
=======


>>>>>>> origin/master


    /**
     * @brief set_IO_NameInfo           设置IO注释名
     * @param robotIdIn                 机器人编号
     * @param IOValueTypeIn             IO类型编号
     * @param logicValueIndexIn         IO逻辑值索引
     * @param nameIn                    目标注释名
     * @param returnFlag                执行返回标识success:0   failed:-1
     * @return                          success:0   failed:-1
     */
    int set_IO_NameInfo(int robotIdIn, int IOValueTypeIn, int logicValueIndexIn, std::string nameIn, int &returnFlag);

    /**
     * @brief get_Control_IO_NamesInfo  获取IO注释名
     * @param robotIdIn                 机器人编号
     * @param IOvalueType               IO类型
     * @param namesOut                  注释名列表输出
     * @return
     */
    int get_Control_IO_NamesInfo(const int &robotIdIn, const int &IOvalueType, std::vector<std::string> &namesOut);
    int playSystemMusic(QString musicFileName);

private:



//    /**
//     * @brief regPrValue        pr寄存器的值，属性property暴露
//     */
////    QVector <PrRegStruct> regPrValue;
//    QVector <PointPro> regPrValue;
//    /**
//     * @brief regPlValue        pl寄存器的值，属性property暴露
//     */
//    QVector <PlRegStruct> regPlValue;

    /**
     * @brief robotId
     */
    int robotId;

//    /**
//     * @brief servoOnFlag ，HMI 界面按钮伺服on标志位
//     */
//   // volatile  bool servoOnFlag;//

    /**
     * @brief servoOnFlag  物理按钮伺服on标志位
     */
    volatile  bool ioServoOnFlag;//

    /**
     * @brief usbExist          usb是否存在
     */
    bool usbExist;
    /**
     * @brief usbSize           usb大小
     */
    double usbSize;
    /**
     * @brief usbUsage          usb使用率
     */
    double usbUsage;
    /**
     * @brief memorySize        内存大小
     */
    double memorySize;
    /**
     * @brief memoryUsage       内存使用率
     */
    double memoryUsage;
    double ramFree;
    double cpuUsedRatio;
    /**
     * @brief hardDiskSize      硬盘大小
     */
    double hardDiskSize;
    /**
     * @brief hardDiskUsage     硬盘使用率
     */
    double hardDiskUsage;
    double hardDiskFree;
    /**
     * @brief motorStatus       电机状态
     */
    QVector <int> motorStatus;
    /**
     * @brief systemOnTimeStr       系统上电时间
     */
    QString systemOnTimeStr;
    /**
     * @brief totalSystemOnTimeStr  系统累计上电时间
     */
    QString totalSystemOnTimeStr;
    /**
     * @brief totalStartMachineTimeStr  设备第一次开机到现在的时间
     */
    QString totalStartMachineTimeStr;
//    /**
//     * @brief servoOnTime           伺服上电时间
//     */
//    int servoOnTime;
//    /**
//     * @brief totalServoOnTime      伺服累计上电时间
//     */
//    int totalServoOnTime;
    /**
     * @brief totalStartMachineTime     设备第一次开机到现在的时间
     */
    int totalStartMachineTime;
    /**
     * @brief sysInfoGet        系统信息对象
     */
    SysInfoGet *sysInfoGet;

//------------------------------------------------------

    RobotManager * robotManager;
    pthread_t threadId;
    bool threadFunFlag;
    /**
     * @brief startDateTime         系统上电的起始时间
     */
    QDateTime startDateTime;
    /**
     * @brief currentDateTime       当前时间
     */
    QDateTime currentDateTime;
    /**
     * @brief oldSystemOnTime       上一次记录的系统总计上电时间
     */
    int oldSystemOnTime;
    /**
     * @brief systemOnTime      系统上电时间
     */
    int systemOnTime;
    /**
     * @brief totalSystemOnTime     系统累计上电时间
     */
    int totalSystemOnTime;
    /**
     * @brief firstStartTime        第一次启动时的日期时间
     */
    QDateTime firstStartTime;

    MemoryInformation memoryInfo;

    ComponentVersion versionInfo;
    int machineStartType;
    bool enableControllerShutdown;
    BatteryMonitor* batteryMonitor;
    int isPlaySoudOnError;
    int firstTimeFlag;

    QVector<long> historyRecordTime; //用于校验日期是否被篡改
    QMutex usingMutex;
    int debugFlag;

    GlobalRegister *globalRegister;
};

#endif // GLOBALMANAGER_H
